package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.dto.ApplicationAddDTO;
import com.xbongbong.paas.pojo.dto.ApplicationCopyDTO;
import com.xbongbong.paas.pojo.dto.ApplicationDelDTO;
import com.xbongbong.paas.pojo.dto.ApplicationListDTO;
import com.xbongbong.paas.pojo.dto.ApplicationSortDTO;
import com.xbongbong.paas.pojo.dto.ApplicationUpdateDTO;
import com.xbongbong.paas.pojo.dto.CheckAllowRollBackDTO;
import com.xbongbong.paas.pojo.dto.EnableApplicationListDTO;
import com.xbongbong.paas.pojo.vo.ApplicationAddVO;
import com.xbongbong.paas.pojo.vo.ApplicationCopyVO;
import com.xbongbong.paas.pojo.vo.ApplicationDelVO;
import com.xbongbong.paas.pojo.vo.ApplicationListVO;
import com.xbongbong.paas.pojo.vo.ApplicationSortVO;
import com.xbongbong.paas.pojo.vo.ApplicationUpdateVO;
import com.xbongbong.paas.pojo.vo.CheckAllowRollBackVo;
import com.xbongbong.paas.pojo.vo.EnableApplicationListVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.app.pojo.dto.AppEnableDTO;
import com.xbongbong.pro.app.pojo.dto.ApplicationAddBatchDTO;
import com.xbongbong.pro.app.pojo.dto.HasFormDataDTO;
import com.xbongbong.pro.app.pojo.vo.AppEnableVO;
import com.xbongbong.pro.app.pojo.vo.ApplicationAddBatchVO;
import com.xbongbong.pro.app.pojo.vo.HasFormDataVO;


/**
 * 应用管理Service
 * @author kaka
 * @author wufeng
 */
public interface PaasAppService {

    /**
     * 新建应用服务
     * @param applicationAddDTO 应用添加DTO
     * @return 返回ApplicationAddVO
     * @throws XbbException 可能出现业务异常
     */
    ApplicationAddVO addPaasApp(ApplicationAddDTO applicationAddDTO) throws XbbException;

    /**
     * 批量插入应用服务
     * @param applicationAddBatchDTO
     * @return
     * @throws XbbException
     */
    ApplicationAddBatchVO addBatchPaasApp(ApplicationAddBatchDTO applicationAddBatchDTO) throws XbbException;

    /**
     * 根据对象applicationListDTO中的corpid 公司id查询对应的应用
     * @author wufeng
     * @date 2018/8/6 15:34
     * @param applicationListDTO 应用列表
     * @descption
     * @return java.util.List<ApplicationListVO>
     * @throws XbbException 可能出现业务异常
     */
    ApplicationListVO listPaasApp(ApplicationListDTO applicationListDTO) throws XbbException;
    /**
     * 删除应用服务
     * @param applicationDelDTO 应用删除DTO
     * @return 返回ApplicationAddVO
     * @throws XbbException 可能出现业务异常
     */
    ApplicationDelVO deletePaasApp(ApplicationDelDTO applicationDelDTO) throws XbbException;

    /**
     * 新建应用服务
     * @param applicationUpdateDTO 应用更新DTO
     * @return 返回ApplicationAddVO
     * @throws XbbException 可能出现业务异常
     */
    ApplicationUpdateVO updatePaasApp(ApplicationUpdateDTO applicationUpdateDTO) throws XbbException;

    /**
     * 排序
     * @author wufeng
     * @date 2018/8/7 14:18
     * @param applicationSortDTO
     * @return 返回ApplicationSortVO
     * @throws XbbException 可能出现业务异常
     */
    ApplicationSortVO updateSort(ApplicationSortDTO applicationSortDTO) throws XbbException;

    /**
     * 获取的应用列表
     * @param enableApplicationListDTO
     * @return
     * @throws XbbException
     */
    EnableApplicationListVO enableAppList(EnableApplicationListDTO enableApplicationListDTO) throws XbbException;

    /**
     * 复制应用
     * @param applicationCopyDTO
     * @return
     * @throws XbbException
     */
    ApplicationCopyVO copy(ApplicationCopyDTO applicationCopyDTO) throws XbbException;
    /**
     * 复制菜单
     * @param applicationCopyDTO 存储corpid，userId
     * @param type 判断是否是流程表单和普通表单
     * @param newMenuId 新的菜单id
     * @param newAppId 新的应用id
     * @param name 新的表单名称
     * @throws XbbException
     */
    void copyMenu(ApplicationCopyDTO applicationCopyDTO, Integer type, Long newMenuId, Long newAppId, String name) throws XbbException;

    /**
     * 启用应用
     * @param appEnableDTO
     * @return 返回前端对象
     * @throws XbbException
     */
    AppEnableVO enableApp(AppEnableDTO appEnableDTO) throws XbbException;

    /**
     * 判断应用是否启用
     * @param appId
     * @param corpid
     * @param alias
     * @param saasMark
     * @return false: 未启用 true 启用
     * @throws XbbException
     */
    Boolean validateAppEnable(Long appId, String alias, Integer saasMark, String corpid) throws XbbException;

    /**
     * 校验是否可以允许回退
     * @param checkAllowRollBackDTO
     * @return
     * @throws XbbException
     */
    CheckAllowRollBackVo checkAllowRollBack(CheckAllowRollBackDTO checkAllowRollBackDTO) throws XbbException;

    /**
     * 判断该应用下是否有数据
     * @param otherDataListDTO
     * @return
     * @throws XbbException
     */
    HasFormDataVO hasData(HasFormDataDTO hasFormDataDTO) throws XbbException;


    /**
     *把应用的启用状态放入缓存中
     * @param coprid
     * @param alias 应用对应的别名
     * @param enable 应用的启用状态。 1启用，0关闭
     * @throws XbbException
     */
    void setEnable2RedisByAlias(String coprid , String alias , Integer enable) throws XbbException;
}
